package org.vaadin.alump.gofullscreen.gwt.client.connect; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.dom.client.Document; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.RootPanel; import com.vaadin.client.BrowserInfo; import com.vaadin.client.communication.StateChangeEvent; import com.vaadin.client.ui.AbstractComponentConnector; import com.vaadin.client.ui.nativebutton.NativeButtonConnector; import com.vaadin.shared.ui.Connect; import org.vaadin.alump.gofullscreen.gwt.client.VFSNativeButton; import org.vaadin.alump.gofullscreen.gwt.client.shared.FSButtonServerRpc; import org.vaadin.alump.gofullscreen.gwt.client.shared.FSNativeButtonState; import java.util.logging.Logger; /** * Created by alump on 08/08/14. */ @SuppressWarnings("serial") @Connect(org.vaadin.alump.gofullscreen.FullScreenNativeButton.class) public class FSNativeButtonConnector extends NativeButtonConnector implements FSButtonCIF { private JavaScriptObject fullscreenTarget; private boolean isInFullScreen = false; private boolean supported = false; private static final Logger LOGGER = Logger.getLogger(FSNativeButtonConnector.class.getName()); public FSNativeButtonConnector() { getWidget().addClickHandler(clickToFullScreenHandler); } @Override public VFSNativeButton getWidget() { return (VFSNativeButton) super.getWidget(); } @Override public FSNativeButtonState getState() { return (FSNativeButtonState) super.getState(); } @Override public void init() { super.init(); supported = FSButtonUtil.isFullscreenSupported(Document.get().getBody()); if (supported) { FSButtonUtil.addInstance(this); } } @Override public void onStateChanged(StateChangeEvent stateChangeEvent) { super.onStateChanged(stateChangeEvent); if (fullscreenTarget != getState().fullscreenTarget) { if (getState().fullscreenTarget == null) { fullscreenTarget = null; } else { fullscreenTarget = ((AbstractComponentConnector) (getState().fullscreenTarget)) .getWidget().getElement(); } notifyStateChange(); } if (!FSButtonUtil.isFullscreenSupported(Document.get().getBody())) { if (getState().hideIfNotSupported) { getWidget().setVisible(false); } } } private final ClickHandler clickToFullScreenHandler = new ClickHandler() { @Override public void onClick(ClickEvent event) { if (!FSNativeButtonConnector.this.isEnabled()) { LOGGER.fine("Ignoring click when not enabled."); return; } JavaScriptObject target = getTargetElement(); if (FSButtonUtil.isInFullScreenMode(target)) { // LOGGER.fine("FullScreen: toogle off"); FSButtonUtil.cancelFullScreen(); notifyStateChange(); } else { // LOGGER.fine("FullScreen: toogle on"); FSButtonUtil.requestFullScreen(target, BrowserInfo.get().isSafari()); notifyStateChange(); } } }; protected void notifyStateChange() { if (FSButtonUtil.isInFullScreenMode(getTargetElement())) { if (!isInFullScreen) { isInFullScreen = true; getRpcProxy(FSButtonServerRpc.class).enteredFullscreen(); } } else { if (isInFullScreen) { isInFullScreen = false; getRpcProxy(FSButtonServerRpc.class).leftFullscreen(); } } } protected JavaScriptObject getTargetElement() { if (fullscreenTarget == null) { return RootPanel.getBodyElement(); } else { return fullscreenTarget; } } /** * Handler for fullscreen events. */ @Override public void onFullScreenChange() { notifyStateChange(); } public void onUnregister() { FSButtonUtil.removeInstance(this); super.onUnregister(); } }